package org.lep.leetcode.mergesortedarray;

import java.util.Arrays;

/**
 * Source : https://oj.leetcode.com/problems/merge-sorted-array/
 *
 * Created by lverpeng on 2017/8/2.
 *
 * Given two sorted integer arrays A and B, merge B into A as one sorted array.
 *
 * Note:
 *   You may assume that A has enough space (size that is greater or equal to m + n)
 *   to hold additional elements from B. The number of elements initialized in A and B
 *   are m and n respectively.
 */
public class MergeSortedArray {

    /**
     * 将数组B合并到数组A，数组A空间足够大能放得下B
     * 合并两个排序的数组，使用两个指针分别指向两个数组，然后比较大小将较小的放到数组A中，
     *          如果把小的放在前面可能回把A中的元素覆盖（数组排序是升序的）
     *
     * 所以可以考虑从两个数组的末尾开始合并，将较大的元素放在A数组的最后
     *
     * 如果任意一个数组遍历完了，把B中剩下的元素依次插入A中
     * @param a
     * @param b
     * @return
     */
    public int[] merge (int[] a, int m, int[] b, int n) {
        int pa = m - 1;
        int pb = n - 1;
        int pc = m + n - 1;
        while (pa > -1 && pb > -1) {
            if (a[pa] > b[pb]) {
                a[pc--] = a[pa--];
            } else {
                a[pc--] = b[pb--];
            }
        }
        while (pb > -1) {
            a[pc--] = b[pb--];
        }
        return a;
    }

    public static void main(String[] args) {
        MergeSortedArray mergeSortedArray = new MergeSortedArray();
        int[] a = new int[]{1,5,9,0,0,0,0};
        int[] b = new int[]{2,3,8};

        System.out.println(Arrays.toString(mergeSortedArray.merge(a, 3, b, 3)));
    }
}
